<?php

namespace app\common\lib;

use think\facade\Log;

/**
 * 网易云信接口
 */
class Netease
{
    private $app_key;
    private $app_secret;
    private $code_msg = [
        200 => "操作成功",
        201 => "客户端版本错误，请升级SDK！",
        301 => "被封禁",
        302 => "用户名或密码错误",
        316 => "IP限制",
        403 => "非法操作或权限不足",
        404 => "对象不存在",
        405 => "参数长度过长",
        406 => "对象只读",
        408 => "客户端请求超时",
        413 => "短信验证失败",
        414 => "参数错误",
        415 => "客户端网络问题",
        416 => "频率控制",
        417 => "重复操作",
        418 => "短信通道不可用",
        419 => "数量超过上限",
        422 => "账户被禁用",
        423 => "账号被禁言",
        431 => "HTTP请求重复",
        500 => "服务器内部错误",
        503 => "服务器繁忙",
        508 => "消息撤回时间超限",
        509 => "无效协议",
        514 => "服务不可用",
        998 => "解包错误",
        999 => "打包错误",
        //群错误码
        801 => "群成员人数达到上限",
        802 => "权限不足",
        803 => "群不存在",
        804 => "用户不在群",
        805 => "群类型无法匹配",
        806 => "创建群数量达到限制",
        807 => "群成员状态错误",
        808 => "申请成功",
        809 => "用户已在群中",
        810 => "邀请成功",
        811 => "账号数量超限",
        812 => "群已禁言，普通成员禁止发送消息。",
        813 => "群拉人部分成功",
        814 => "禁止使用群组已读服务",
        815 => "群管理员人员超限",
        //音视频、白板、通话
        9102 => "通道失效",
        9103 => "已在其他端对呼叫响应过",
        11001 => "通话不可达，对方已离线。",
        //聊天室
        13001 => "IM主连接状态异常",
        13002 => "聊天室状态异常",
        13003 => "黑名单账号，禁止进入聊天室！",
        13004 => "禁言账号，禁止发言！",
        13005 => "用户的聊天室昵称、头像等已被发垃圾",
        //特定业务
        10431 => "邮箱格式有误",
        10432 => "手机格式有误",
        10433 => "密码确认失败",
        10434 => "企业不存在",
        10435 => "登陆账户或密码错误",
        10436 => "应用不存在",
        10437 => "邮箱已注册",
        10438 => "手机已注册",
        10441 => "应用名已存在",
    ];

    public function __construct()
    {
        $this->app_key = config('netease.app_key');
        $this->app_secret = config('netease.app_secret');
    }

    /*获取随机数*/
    private function getNonce($size = 128)
    {
        $nonce = "";
        $hexDigits = "0123456789abcdef";
        //随机字符串最大128个字符，也可以小于该数
        for ($i = 0; $i < $size; $i++) {
            $nonce .= $hexDigits[rand(0, 15)];
        }
        return $nonce;
    }

    /*计算并获取CheckSum*/
    private function getCheckSum($nonce, $curtime)
    {
        $app_secret = $this->app_secret;
        $check_sum = sha1($app_secret . $nonce . $curtime);
        return $check_sum;
    }

    /*生成Header头信息*/
    private function buildHeader()
    {
        $app_key = $this->app_key;
        $nonce = $this->getNonce();
        $curtime = time();
        $check_sum = $this->getCheckSum($nonce, $curtime);

        $header = [];
        $header[] = "AppKey:" . $app_key;
        $header[] = "Nonce:" . $nonce;
        $header[] = "CurTime:" . $curtime;
        $header[] = "CheckSum:" . $check_sum;
        $header[] = "Content-Type:application/x-www-form-urlencoded;charset=utf8";

        return $header;
    }

    /*生成HTTP POST提交的字段*/
    private function buildPostFields($data)
    {
        $ret = "";
        if (is_array($data) && count($data) > 0) {
            $arr = [];
            foreach ($data as $k => $v) {
                array_push($arr, $k . "=" . urlencode($v));
            }
            $ret = join("&", $arr);
        }
        return $ret;
    }

    /*使用CURL进行远程数据提交*/
    private function curlPost($url, $fields, $header, $timeout = 5000)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $result = curl_exec($ch);
        if ($result === false) {
            $result = curl_errno($ch);
        }
        return $result;
    }

    /*使用HTTP POST提交数据*/
    private function httpPost($url, $data)
    {
        $header = $this->buildHeader();
        $fields = $this->buildPostFields($data);
        $json = $this->curlPost($url, $fields, $header);
        $ret = json_decode($json, true);
        return $ret;
    }

    private function toJson($var)
    {
        $arr = [];
        if (is_array($var) && count($var) > 0) {
            $arr = $var;
        } else if (is_string($var) && strpos($var, ",")) {
            $arr = explode(",", trim($var, ","));
        } else {
            $arr[] = $var;
        }
        $json = json_encode($arr,JSON_UNESCAPED_UNICODE);
        return $json;
    }

    /**
     * 创建网易云通信ID
     * 描述：
     * 1.第三方帐号导入到网易云通信平台；
     * 2.注意accid，name长度以及考虑管理token。
     * 参数：
     * @param String $accid 必须 网易云通信ID，最大长度32字符，必须保证一个 APP内唯一（只允许字母、数字、半角下划线_、@、半角点以及半角-组成，不区分大小写，会统一小写处理
     * @param String $name 可选 网易云通信ID昵称，最大长度64字符，用来PUSH推送时显示的昵称
     * @param String $icon 可选 网易云通信ID头像URL，第三方可选填，最大长度1024
     */
    public function createUser($data)
    {
        $fields = [];
        //网易云通信ID，最大长度32字符，必须保证一个 APP内唯一（只允许字母、数字、半角下划线_、@、半角点以及半角-组成，不区分大小写，会统一小写处理
        if (!isset($data["accid"]) || empty($data["accid"])) {
            return false;
        }
        $fields["accid"] = strtolower(strval($data["accid"]));
        //网易云通信ID可以指定登录token值，最大长度128字符，并更新，如果未指定，会自动生成token，并在创建成功后返回。
        if (isset($data["token"]) && !empty($data["token"])) {
            $fields["token"] = $data["token"];
        }
        //网易云通信ID昵称，最大长度64字符，用来PUSH推送时显示的昵称。
        if (isset($data["name"]) && !empty($data["name"])) {
            $fields["name"] = $data["name"];
        }
        //网易云通信ID头像URL，第三方可选填，最大长度1024。
        if (isset($data["icon"]) && !empty($data["icon"])) {
            $fields["icon"] = $data["icon"];
        }
        //网易云通信用户email，最大长度64字符。
        if (isset($data["email"]) && !empty($data["email"])) {
            $fields["email"] = $data["email"];
        }
        //网易云通信用户mobile，最大长度32字符，非中国大陆手机号码需要填写国家代码(如美国：+1-xxxxxxxxxx)或地区代码(如香港：+852-xxxxxxxx)。
        if (isset($data["mobile"]) && !empty($data["mobile"])) {
            $fields["mobile"] = $data["mobile"];
        }
        //网易云通信用户性别，0表示未知，1表示男，2女表示女，其它会报参数错误。
        if (isset($data["gender"]) && in_array($data["gender"], [0, 1, 2])) {
            $fields["gender"] = $data["gender"];
        }
        //网易云通信用户生日，最大长度16字符。
        if (isset($data["birth"]) && !empty($data["birth"])) {
            $fields["birth"] = $data["birth"];
        }
        //网易云通信用户签名，最大长度256字符。
        if (isset($data["sign"]) && !empty($data["sign"])) {
            $fields["sign"] = $data["sign"];
        }
        //网易云通信json属性，第三方可选填，最大长度1024字符。
        if (isset($data["props"]) && !empty($data["props"])) {
            $fields["props"] = json_encode($data["props"],JSON_UNESCAPED_UNICODE);
        }
        //网易云通信用户名片扩展字段，最大长度1024字符，用户可自行扩展，建议封装成JSON字符串。
        if (isset($data["ex"]) && !empty($data["ex"])) {
            $fields["ex"] = json_encode($data["ex"],JSON_UNESCAPED_UNICODE);
        }
        //远程提交
        $ret = [];
        $url = "https://api.netease.im/nimserver/user/create.action";
        $result = $this->httpPost($url, $fields);
        if (isset($result["code"]) && !empty($result["code"])) {
            $ret["message"] = $this->code_msg[$result["code"]];
        }
        if (isset($result["code"]) && $result["code"] == 200) {
            $ret["error"] = 0;
        } else {
            $ret["error"] = 1;
        }
        if (isset($result["desc"]) && !empty($result["desc"])) {
            $ret["desc"] = $result["desc"];
        }
        if (isset($result["info"]) && !empty($result["info"])) {
            $ret["accid"] = $result["info"]["accid"];
            $ret["token"] = $result["info"]["token"];
            $ret["name"] = $result["info"]["name"];
        }
        return $ret;
    }

    /**
     * 获取用户名片
     * 描述：
     * 1.获取用户名片，可批量
     * 参数：
     * @param String $accids 必须 用户帐号（例如：JSONArray对应的accid串，如：["zhangsan"]，如果解析出错，会报414）（一次查询最多为200）
     */
    public function getUinfos($accids)
    {
        $fields = [];
        //网易云通信ID，最大长度32字符，必须保证一个 APP内唯一（只允许字母、数字、半角下划线_、@、半角点以及半角-组成，不区分大小写，会统一小写处理
        if (!isset($accids) || empty($accids)) {
            return false;
        }
        //用户帐号（例如：JSONArray对应的accid串，如：["zhangsan"]，如果解析出错，会报414）（一次查询最多为200）
        $fields["accids"] = $this->toJson($accids);
        //发送请求
        $ret = [];
        $url = "https://api.netease.im/nimserver/user/getUinfos.action";
        $result = $this->httpPost($url, $fields);
        if (isset($result["code"]) && !empty($result["code"])) {
            $ret["message"] = $this->code_msg[$result["code"]];
        }
        if (isset($result["code"]) && $result["code"] == 200) {
            $ret["error"] = 0;
        } else {
            $ret["error"] = 1;
        }
        if (isset($result["desc"]) && !empty($result["desc"])) {
            $ret["desc"] = $result["desc"];
        }
        if (isset($result["uinfos"]) && !empty($result["uinfos"])) {
            $cnt = count($result["uinfos"]);
            if ($cnt == 1) {
                foreach (current($result["uinfos"]) as $k => $v) {
                    $ret[$k] = $v;
                }
            } elseif ($cnt > 1) {
                $ret["uinfos"] = $result["uinfos"];
            }
        }
        return $ret;
    }

    //修改用户名片
    public function updateUinfo($data)
    {
        $fields = [];
        //网易云通信ID，最大长度32字符，必须保证一个 APP内唯一（只允许字母、数字、半角下划线_、@、半角点以及半角-组成，不区分大小写，会统一小写处理
        if (!isset($data["accid"]) || empty($data["accid"])) {
            return false;
        }
        $fields["accid"] = strtolower(strval($data["accid"]));
        //网易云通信ID昵称，最大长度64字符，用来PUSH推送时显示的昵称。
        if (isset($data["name"]) && !empty($data["name"])) {
            $fields["name"] = $data["name"];
        }
        //网易云通信ID头像URL，第三方可选填，最大长度1024。
        if (isset($data["icon"]) && !empty($data["icon"])) {
            $fields["icon"] = $data["icon"];
        }
        //网易云通信用户email，最大长度64字符。
        if (isset($data["email"]) && !empty($data["email"])) {
            $fields["email"] = $data["email"];
        }
        //网易云通信用户mobile，最大长度32字符，非中国大陆手机号码需要填写国家代码(如美国：+1-xxxxxxxxxx)或地区代码(如香港：+852-xxxxxxxx)。
        if (isset($data["mobile"]) && !empty($data["mobile"])) {
            $fields["mobile"] = $data["mobile"];
        }
        //网易云通信用户性别，0表示未知，1表示男，2女表示女，其它会报参数错误。
        if (isset($data["gender"]) && in_array($data["gender"], [0, 1, 2])) {
            $fields["gender"] = $data["gender"];
        }
        //网易云通信用户生日，最大长度16字符。
        if (isset($data["birth"]) && !empty($data["birth"])) {
            $fields["birth"] = $data["birth"];
        }
        //网易云通信用户签名，最大长度256字符。
        if (isset($data["sign"]) && !empty($data["sign"])) {
            $fields["sign"] = $data["sign"];
        }
        //网易云通信json属性，第三方可选填，最大长度1024字符。
        if (isset($data["props"]) && !empty($data["props"])) {
            $fields["props"] = json_encode($data["props"],JSON_UNESCAPED_UNICODE);
        }
        //网易云通信用户名片扩展字段，最大长度1024字符，用户可自行扩展，建议封装成JSON字符串。
        if (isset($data["ex"]) && !empty($data["ex"])) {
            $fields["ex"] = json_encode($data["ex"],JSON_UNESCAPED_UNICODE);
        }
        //远程提交
        $ret = [];
        $url = "https://api.netease.im/nimserver/user/updateUinfo.action";
        $result = $this->httpPost($url, $fields);
        if (isset($result["code"]) && !empty($result["code"])) {
            $ret["message"] = $this->code_msg[$result["code"]];
        }
        if (isset($result["code"]) && $result["code"] == 200) {
            $ret["error"] = 0;
        } else {
            $ret["error"] = 1;
        }
        if (isset($result["desc"]) && !empty($result["desc"])) {
            $ret["desc"] = $result["desc"];
        }
        return $result;
    }

    //封禁用户
    public function blockUser($data){
        $fields = [];
        //网易云通信ID，最大长度32字符，必须保证一个 APP内唯一（只允许字母、数字、半角下划线_、@、半角点以及半角-组成，不区分大小写，会统一小写处理
        if (!isset($data['accid']) || empty($data['accid'])) {
            return false;
        }
        //用户帐号（例如：JSONArray对应的accid串，如：["zhangsan"]，如果解析出错，会报414）（一次查询最多为200）
        $fields["accid"] = $data['accid'];
        if (!isset($data['needkick']) || empty($data['needkick'])) {
            $fields["needkick"] = false;
        }
        //发送请求
        $ret = [];
        $url = "https://api.netease.im/nimserver/user/block.action";
        $result = $this->httpPost($url, $fields);
        if (isset($result["code"]) && !empty($result["code"])) {
            $ret["message"] = $this->code_msg[$result["code"]];
        }
        if (isset($result["code"]) && $result["code"] == 200) {
            $ret["error"] = 0;
        } else {
            $ret["error"] = 1;
        }
        if (isset($result["desc"]) && !empty($result["desc"])) {
            $ret["desc"] = $result["desc"];
        }
        return $ret;
    }

    //更新好友相关信息
    public function updateFriendInfo($data){
        $fields = [];
        //网易云通信ID，最大长度32字符，必须保证一个 APP内唯一（只允许字母、数字、半角下划线_、@、半角点以及半角-组成，不区分大小写，会统一小写处理
        if (!isset($data['accid']) || empty($data['accid'])) {
            return false;
        }
        //用户帐号（例如：JSONArray对应的accid串，如：["zhangsan"]，如果解析出错，会报414）（一次查询最多为200）
        $fields["accid"] = $data['accid'];
        if (!isset($data['faccid']) || empty($data['faccid'])) {
            return false;
        }
        $fields["faccid"] = $data['faccid'];
        //网易云通信用户名片扩展字段，最大长度1024字符，用户可自行扩展，建议封装成JSON字符串。
        if (isset($data["ex"]) && !empty($data["ex"])) {
            $fields["ex"] = json_encode($data["ex"],JSON_UNESCAPED_UNICODE);
        }
        //发送请求
        $ret = [];
        $url = "https://api.netease.im/nimserver/friend/update.action";
        $result = $this->httpPost($url, $fields);
        if (isset($result["code"]) && !empty($result["code"])) {
            $ret["message"] = $this->code_msg[$result["code"]];
        }
        if (isset($result["code"]) && $result["code"] == 200) {
            $ret["error"] = 0;
        } else {
            $ret["error"] = 1;
        }
        if (isset($result["desc"]) && !empty($result["desc"])) {
            $ret["desc"] = $result["desc"];
        }
        return $ret;
    }

    //添加好友
    public function addFriend($data){
        $fields = [];
        //网易云通信ID，最大长度32字符，必须保证一个 APP内唯一（只允许字母、数字、半角下划线_、@、半角点以及半角-组成，不区分大小写，会统一小写处理
        if (!isset($data['accid']) || empty($data['accid'])) {
            return false;
        }
        //用户帐号（例如：JSONArray对应的accid串，如：["zhangsan"]，如果解析出错，会报414）（一次查询最多为200）
        $fields["accid"] = $data['accid'];
        if (!isset($data['faccid']) || empty($data['faccid'])) {
            return false;
        }
        $fields["faccid"] = $data['faccid'];
        if (!isset($data["type"]) || empty($data["type"])||!in_array($data["type"],[1,2,3,4])){
            return false;
        }
        $fields["type"] = $data['type'];
        //发送请求
        $ret = [];
        $url = "https://api.netease.im/nimserver/friend/add.action";
        $result = $this->httpPost($url, $fields);
        if (isset($result["code"]) && !empty($result["code"])) {
            $ret["message"] = $this->code_msg[$result["code"]];
        }
        if (isset($result["code"]) && $result["code"] == 200) {
            $ret["error"] = 0;
        } else {
            $ret["error"] = 1;
        }
        if (isset($result["desc"]) && !empty($result["desc"])) {
            $ret["desc"] = $result["desc"];
        }
        return $ret;
    }

    //好友列表
    public function friendList($data){
        $fields = [];
        //网易云通信ID，最大长度32字符，必须保证一个 APP内唯一（只允许字母、数字、半角下划线_、@、半角点以及半角-组成，不区分大小写，会统一小写处理
        if (!isset($data['accid']) || empty($data['accid'])) {
            return false;
        }
        //用户帐号（例如：JSONArray对应的accid串，如：["zhangsan"]，如果解析出错，会报414）（一次查询最多为200）
        $fields["accid"] = $data['accid'];
        if (!isset($data["updatetime"]) || empty($data["updatetime"])){
            return false;
        }
        $fields["updatetime"] = $data['updatetime'];
        //发送请求
        $ret = [];
        $url = "https://api.netease.im/nimserver/friend/get.action";
        $result = $this->httpPost($url, $fields);
        if (isset($result["code"]) && !empty($result["code"])) {
            $ret["message"] = $this->code_msg[$result["code"]];
        }
        if (isset($result["code"]) && $result["code"] == 200) {
            $ret["error"] = 0;
        } else {
            $ret["error"] = 1;
        }
        if (isset($result["desc"]) && !empty($result["desc"])) {
            $ret["desc"] = $result["desc"];
        }
        $ret["list"] = $result["friends"];
        return $ret;
    }


    /**
     * 创建聊天室
     * 描述：
     * 参数：
     * @param String $creator 必须 聊天室属主的账号accid
     * @param String $name 必须 聊天室名称，长度限制128个字符
     * @param String $announcement 可选 公告，长度限制4096个字符
     * @param String $broadcasturl 可选 直播地址，长度限制1024个字符
     * @param String $queuelevel 可选 队列管理权限：0:所有人都有权限变更队列，1:只有主播管理员才能操作变更。默认0
     * @param String $ext 可选 扩展字段，最长4096字符
     * @return array
     */
    public function createChatroom($data)
    {
        $fields = [];
        //聊天室属主的账号accid
        if (!isset($data["creator"]) || empty($data["creator"])) {
            return false;
        }
        $fields["creator"] = $data["creator"];
        //聊天室名称，长度限制128个字符
        if (!isset($data["name"]) || empty($data["name"])) {
            return false;
        }
        $fields["name"] = $data["name"];
        //公告，长度限制4096个字符
        if (isset($data["announcement"]) && !empty($data["announcement"])) {
            $fields["announcement"] = $data["announcement"];
        }
        //直播地址，长度限制1024个字符
        if (isset($data["broadcasturl"]) && !empty($data["broadcasturl"])) {
            $fields["broadcasturl"] = $data["broadcasturl"];
        }
        //队列管理权限：0:所有人都有权限变更队列，1:只有主播管理员才能操作变更。默认0
        if (isset($data["queuelevel"]) && in_array($data["queuelevel"], [0, 1])) {
            $fields["queuelevel"] = $data["queuelevel"];
        }
        //扩展字段，最长4096字符
        if (isset($data["ext"]) && !empty($data["ext"])) {
            $fields["ext"] = $data["ext"];
        }
        //发送请求
        $ret = [];
        $url = "https://api.netease.im/nimserver/chatroom/create.action";
        $result = $this->httpPost($url, $fields);
        if (isset($result["code"]) && !empty($result["code"])) {
            $ret["message"] = $this->code_msg[$result["code"]];
        }
        if (isset($result["code"]) && $result["code"] == 200) {
            $ret["error"] = 0;
        } else {
            $ret["error"] = 1;
        }
        if (isset($result["desc"]) && !empty($result["desc"])) {
            $ret["desc"] = $result["desc"];
        }
        if (isset($result["chatroom"]) && !empty($result["chatroom"])) {
            $chatroom = $result["chatroom"];
            $ret["roomid"] = $chatroom["roomid"];
            $ret["valid"] = $chatroom["valid"];
            $ret["announcement"] = $chatroom["announcement"];
            $ret["name"] = $chatroom["name"];
            $ret["broadcasturl"] = $chatroom["broadcasturl"];
            $ret["creator"] = $chatroom["creator"];
            $ret["ext"] = $chatroom["ext"];
        }
        return $ret;
    }

    /**
     * 创建群
     * 注意：
     * 所有群操作一个ip一分钟操作次数超过6000次，会返回416错误码。
     * 描述：
     * 1.创建高级群，以邀请的方式发送给用户；
     * 2.custom 字段是给第三方的扩展字段，第三方可以基于此字段扩展高级群的功能，构建自己需要的群；
     * 3.建群成功会返回tid，需要保存，以便于加人与踢人等后续操作；
     * 4.每个用户可创建的群数量有限制，限制值由 IM 套餐的群组配置决定，可登录管理后台查看。
     * 参数：
     * @param String $tname 必须 群名称，最大长度64字符
     * @param String $owner 必须 群主用户帐号，最大长度32字符
     * @param Array $members 必须 ["aaa","bbb"](JSONArray对应的accid，如果解析出错会报414)，一次最多拉200个成员
     * @param String $msg 必须 邀请发送的文字，最大长度150字符
     * @param int $magree 必须 管理后台建群时，0不需要被邀请人同意加入群，1需要被邀请人同意才可以加入群。其它会返回414
     * @param int $joinmode 必须 群建好后，sdk操作时，0不用验证，1需要验证,2不允许任何人加入。其它返回414
     * @return
     */
    public function createTeam($data)
    {
        $fields = [];
        //群名称，最大长度64字符
        if (!isset($data["tname"]) || empty($data["tname"])) {
            return false;
        }
        $fields["tname"] = $data["tname"];
        //群主用户帐号，最大长度32字符
        if (!isset($data["owner"]) || empty($data["owner"])) {
            return false;
        }
        $fields["owner"] = $data["owner"];
        //["aaa","bbb"](JSONArray对应的accid，如果解析出错会报414)，一次最多拉200个成员
        if (!isset($data["members"]) || empty($data["members"])) {
            return false;
        }
        $fields["members"] = $this->toJson($data["members"]);
        //邀请发送的文字，最大长度150字符
        if (!isset($data["msg"]) || empty($data["msg"])) {
            $data["msg"] = "【ID:{$data["owner"]}】邀请你加入【{$data["tname"]}】";
        }
        $fields["msg"] = $data["msg"];
        //管理后台建群时，0不需要被邀请人同意加入群，1需要被邀请人同意才可以加入群。其它会返回414
        if (!isset($data["magree"]) || !in_array($data["magree"], [0, 1])) {
            $data["magree"] = 0;
        }
        $fields["magree"] = $data["magree"];
        //群建好后，sdk操作时，0不用验证，1需要验证,2不允许任何人加入。其它返回414
        if (!isset($data["joinmode"]) || !in_array($data["joinmode"], [0, 1, 2])) {
            $data["joinmode"] = 0;
        }
        $fields["joinmode"] = $data["joinmode"];
        //发送消息
        $ret = [];
        $url = "https://api.netease.im/nimserver/team/create.action";
        $result = $this->httpPost($url, $fields);
        if (isset($result["code"]) && !empty($result["code"])) {
            $ret["message"] = $this->code_msg[$result["code"]];
        }
        if (isset($result["code"]) && $result["code"] == 200) {
            $ret["error"] = 0;
        } else {
            $ret["error"] = 1;
        }
        if (isset($result["desc"]) && !empty($result["desc"])) {
            $ret["desc"] = $result["desc"];
        }
        if (isset($result["tid"]) && !empty($result["tid"])) {
            $ret["tid"] = $result["tid"];
        }
        return $ret;
    }

    /**
     * 拉人入群
     * 如果邀请的人中存在加群数量超限的情况，会返回faccid
     * 描述：
     * 1.可以批量邀请，邀请时需指定群主；
     * 2.当群成员达到上限时，再邀请某人入群返回失败；
     * 3.当群成员达到上限时，被邀请人“接受邀请"的操作也将返回失败。
     * 参数：
     * @param String $tid 必须 网易云通信服务器产生，群唯一标识，创建群时会返回，最大长度128字符
     * @param String $owner 必须 群主用户帐号，最大长度32字符
     * @param String $members 必须 ["aaa","bbb"](JSONArray对应的accid，如果解析出错会报414)，一次最多拉200个成员
     * @param int $magree 必须 管理后台建群时，0不需要被邀请人同意加入群，1需要被邀请人同意才可以加入群。其它会返回414
     * @param String $msg 必须 邀请发送的文字，最大长度150字符
     * @param String $attach 可选 自定义扩展字段，最大长度512
     * @return bool
     */
    public function addTeam($data)
    {
        $fields = [];
        //网易云通信服务器产生，群唯一标识，创建群时会返回，最大长度128字符
        if (!isset($data["tid"]) || empty($data["tid"])) {
            return false;
        }
        $fields["tid"] = $data["tid"];
        //群主用户帐号，最大长度32字符
        if (!isset($data["owner"]) || empty($data["owner"])) {
            return false;
        }
        $fields["owner"] = $data["owner"];
        //["aaa","bbb"](JSONArray对应的accid，如果解析出错会报414)，一次最多拉200个成员
        if (!isset($data["members"]) || empty($data["members"])) {
            return false;
        }
        $fields["members"] = $this->toJson($data["members"]);
        //邀请发送的文字，最大长度150字符
        if (!isset($data["msg"]) || empty($data["msg"])) {
            $data["msg"] = "拉人入群";
        }
        $fields["msg"] = $data["msg"];
        //管理后台建群时，0不需要被邀请人同意加入群，1需要被邀请人同意才可以加入群。其它会返回414
        if (!isset($data["magree"]) || !in_array($data["magree"], [0, 1])) {
            $data["magree"] = 0;
        }
        $fields["magree"] = $data["magree"];
        //自定义扩展字段，最大长度512
        if (isset($data["attach"]) && !empty($data["attach"])) {
            $fields["attach"] = $data["attach"];
        }
        //发送消息
        $ret = [];
        $url = "https://api.netease.im/nimserver/team/add.action";
        $result = $this->httpPost($url, $fields);
        if (isset($result["code"]) && !empty($result["code"])) {
            $ret["message"] = $this->code_msg[$result["code"]];
        }
        if (isset($result["code"]) && $result["code"] == 200) {
            $ret["error"] = 0;
        } else {
            $ret["error"] = 1;
        }
        if (isset($result["desc"]) && !empty($result["desc"])) {
            $ret["desc"] = $result["desc"];
        }
        return $ret;
    }

    /**
     * 获取某用户所加入的群信息
     * 描述：
     * 获取某个用户所加入高级群的群信息
     * 参数：
     * @param String $accid 必须 要查询用户的accid
     * @return
     */
    public function joinTeams($accid)
    {
        $fields = [];
        //要查询用户的accid
        if (!isset($accid) || empty($accid)) {
            return false;
        }
        $fields["accid"] = $accid;
        //发送消息
        $ret = [];
        $url = 'https://api.netease.im/nimserver/team/joinTeams.action';
        $result = $this->httpPost($url, $fields);
        if (isset($result["code"]) && !empty($result["code"])) {
            $ret["message"] = $this->code_msg[$result["code"]];
        }
        if (isset($result["code"]) && $result["code"] == 200) {
            $ret["error"] = 0;
        } else {
            $ret["error"] = 1;
        }
        if (isset($result["desc"]) && !empty($result["desc"])) {
            $ret["desc"] = $result["desc"];
        }
        if (isset($result["infos"]) && !empty($result["infos"])) {
            $ret["infos"] = $result["infos"];
        }
        return $ret;
    }

    /**
     * 发送自定义系统通知
     * 描述：
     * 1、自定义系统通知区别于普通消息，方便开发者进行业务逻辑的通知；
     * 2、目前支持两种类型：点对点类型和群类型（仅限高级群），根据msgType有所区别。
     * 参数：
     * @param String $from 必须 发送者accid，用户帐号，最大32字符，必须保证一个APP内唯一
     * @param int $msgtype 必须 0：点对点自定义通知，1：群消息自定义通知，其他返回414
     * @param String $to 必须 msgtype==0是表示accid即用户id，msgtype==1表示tid即群id
     * @param String $body 必须 消息内容，最大4096字符
     * @return
     */
    public function sendAttachMsg($from, $to, $attach, $msgtype = 1)
    {
        $fields = [];
        //发送者accid，用户帐号，最大32字符，必须保证一个APP内唯一
        if (!isset($from) || empty($from)) {
            return false;
        }
        $fields["from"] = $from;
        //0：点对点自定义通知，1：群消息自定义通知，其他返回414
        if (!isset($msgtype) || !in_array($msgtype, [0, 1])) {
            return false;
        }
        $fields["msgtype"] = $msgtype;
        //msgtype==0是表示accid即用户id，msgtype==1表示tid即群id
        if (!isset($to) || empty($to)) {
            return false;
        }
        $fields["to"] = $to;
        //自定义通知内容，第三方组装的字符串，建议是JSON串，最大长度4096字符
        if (!isset($attach) || empty($attach)) {
            return false;
        }
        if (is_array($attach) && count($attach)) {
            $fields["attach"] = json_encode($attach,JSON_UNESCAPED_UNICODE);
        } elseif (is_string($attach)) {
            $fields["attach"] = $attach;
        }

        //远程提交
        $url = 'https://api.netease.im/nimserver/msg/sendAttachMsg.action';
        $ret = [];
        $result = $this->httpPost($url, $fields);
        if (isset($result["code"]) && !empty($result["code"])) {
            $ret["message"] = $this->code_msg[$result["code"]];
        }
        if (isset($result["code"]) && $result["code"] == 200) {
            $ret["error"] = 0;
        } else {
            $ret["error"] = 1;
        }
        if (isset($result["desc"]) && !empty($result["desc"])) {
            $ret["desc"] = $result["desc"];
        }
        return $ret;
    }

    /**
     * 发送普通消息
     * 给用户或者高级群发送普通消息，包括文本，图片，语音，视频和地理位置
     * @param String $from 必须 发送者accid，用户帐号，最大32字符，必须保证一个APP内唯一
     * @param int $ope 必须   0：点对点个人消息，1：群消息（高级群），其他返回414
     * @param String $to 必须 ope==0是表示accid即用户id，ope==1表示tid即群id
     * @param String $type 必须 消息类型
     * 0 表示文本消息,
     * 1 表示图片，
     * 2 表示语音，
     * 3 表示视频，
     * 4 表示地理位置信息，
     * 6 表示文件，
     * 100 自定义消息类型（特别注意，对于未对接易盾反垃圾功能的应用，该类型的消息不会提交反垃圾系统检测）
     * @param String $body 必须 消息的body字段，最大长度5000字符，为一个JSON串
     * @param String $antispam 必须
     * 对于对接了易盾反垃圾功能的应用，本消息是否需要指定经由易盾检测的内容（antispamCustom）。
     * true或false, 默认false。
     * 只对消息类型为：100 自定义消息类型 的消息生效。
     *
     * @return bool
     */
    public function sendMsg($from, $to, $body, $ope = 1, $type = 100)
    {
        $fields = [];
        //0：点对点个人消息，1：群消息（高级群），其他返回414
        if (!isset($ope) || !in_array($ope, [0, 1])) {
            return false;
        }
        $fields["ope"] = $ope;
        //消息类型
        if (!isset($type) || !in_array($type, [0, 1, 2, 3, 4, 6, 100])) {
            return false;
        }
        $fields["type"] = $type;
        //发送者accid，用户帐号，最大32字符，必须保证一个APP内唯一
        if (!isset($from) || empty($from)) {
            return false;
        }
        $fields["from"] = $from;
        //ope==0是表示accid即用户id，ope==1表示tid即群id
        if (!isset($to) || empty($to)) {
            return false;
        }
        $fields["to"] = $to;
        //消息的body字段，最大长度5000字符，为一个JSON串
        if (!isset($body) || empty($body)) {
            return false;
        }
        if (is_array($body) && count($body)) {
            $fields["body"] = json_encode($body,JSON_UNESCAPED_UNICODE);
        } elseif (is_string($body)) {
            $fields["body"] = $body;
        }

        //发送消息
        $url = 'https://api.netease.im/nimserver/msg/sendMsg.action';
        $result = $this->httpPost($url, $fields);
        if (isset($result["code"]) && !empty($result["code"])) {
            $ret["message"] = $this->code_msg[$result["code"]];
        }
        if (isset($result["code"]) && $result["code"] == 200) {
            $ret["error"] = 0;
        } else {
            $ret["error"] = 1;
        }
        if (isset($result["desc"]) && !empty($result["desc"])) {
            $ret["desc"] = $result["desc"];
        }
        if (isset($result["data"]) && !empty($result["data"])) {
            $ret["msgid"] = $result["data"]["msgid"];
            $ret["antispam"] = $result["data"]["antispam"];
        }
        return $ret;
    }
}